use time::{macros::format_description, UtcOffset};
use tracing_appender::{non_blocking::WorkerGuard, rolling};
use tracing_subscriber::{
    fmt::{self, time::OffsetTime},
    layer::SubscriberExt,
    util::SubscriberInitExt,
    EnvFilter, Registry,
};
pub fn init_logger_cofnig() -> WorkerGuard {
    // 默认设置为info级别
    let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));

    // 配置日志时间格式
    // 配置时区:东8区, 如果设置失败则采用默认时区
    let time_offset = UtcOffset::from_hms(8, 0, 0).unwrap_or(UtcOffset::UTC);

    // 设置时间格式为年-月-日 时:分:秒
    let logger_time = OffsetTime::new(
        time_offset,
        format_description!("[year]-[month]-[day] [hour]:[minute]:[second]"),
    );

    let format_layer = fmt::layer()
        .with_file(true) // 在日志中添加当前文件信息
        .with_timer(logger_time.clone()) // 日志中配置时间格式
        .pretty() // 增强日志可读性
        .with_writer(std::io::stdout); // 日志输出到控制台

    // 同时输出到日志文件
    let file_appender = rolling::daily("logs", "app.log");
    let (non_blocking_appender, guard) = tracing_appender::non_blocking(file_appender);

    let file_layer = fmt::layer()
        .with_file(true) // 打印文件信息
        .with_timer(logger_time) // 打印时间
        .with_ansi(false) // 禁用颜色
        .with_writer(non_blocking_appender); // 新增文件write

    Registry::default()
        .with(env_filter)
        .with(format_layer)
        .with(file_layer)
        .init();

    // 守卫, 返回以供随时使用
    guard
}
